home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / !applications! / stc4102 / sources / optidec.s < prev   
Text File  |  1993-12-06  |  4KB  |  190 lines

  1. ;-----------------------------------------------------------------------------
  2. ;S404 highly optimized data_decruncher_lib 1.0_turbo for use in stc.library
  3. ;23.11.93 by Marcus 'Cozine' Ottosson
  4. ;
  5. ; This is a highly optimized library decruncher.  The code does not fit into
  6. ; the instruction cache (286 bytes).  Generally, it's NOT possible to use all
  7. ; the 256 bytes available in the instruction cache.  The caches in the 68020
  8. ; and the 68030 consist of 16 rows, each of which contains 16 bytes.
  9. ; AllocMem() and AllocPooled(), the memory allocation routines used for
  10. ; loading executables, guarantee 8-byte alignment.
  11. ; On the 68000 my large testfile decrunches 3.7% faster in this version than
  12. ; the standard version.  Some files may decrunch much slower on the 68020 and
  13. ; the 68030.  I don't know the maximum loss, probably about 10-20%.  The loss
  14. ; will not be very high when we are multitasking, since the interrupts cause a
  15. ; partial or complete cache flush anyway.  I want some some test reports!!!
  16. ;
  17. ;-----------------------------------------------------------------------------
  18. ;S404 data_decruncher v0.2
  19. ;(c) 1993 by Jouni 'Mr.Spiv' Korhonen (SWSW)
  20. ;-----------------------------------------------------------------------------
  21. ;call with registers: a2 = destination address
  22. ;                     a1 = crunched data
  23. ;-----------------------------------------------------------------------------
  24.  
  25. ;Uses d0-d7/a0-a6
  26.  
  27.  
  28.  
  29.  
  30. decrunch:
  31. l0:        addq    #8,a1
  32. edDCopyableStart:
  33.         move.l    a2,a5
  34.         add.l    (a1)+,a2
  35.         add.l    (a1),a1
  36. edDCopyableStart2:
  37.         moveq    #0,d4
  38.         moveq    #16,d5
  39.         movem    (a1),d2/d6/d7
  40.         not    d4
  41.         lea    loff6(pc),a3
  42.         lea    llen5a(pc),a4
  43.         moveq    #1,d0
  44.         moveq    #-1,d3
  45.         bra.s    ltest1
  46.  
  47.         cnop    0,8            ; Use if main loop>=244 bytes
  48.  
  49. ;*** Here's the start of the instruction cache
  50.  
  51. lins:        subq    #8,d7
  52.         bpl.s    lins2
  53. lins1:        move    d7,d1
  54.         addq    #8,d7
  55.         lsl.l    d7,d6
  56.         move    -(a1),d6
  57.         neg    d1
  58.         lsl.l    d1,d6
  59.         addq    #8,d7
  60.         swap    d6
  61.         move.b    d6,-(a2)
  62.         swap    d6
  63.         cmp.l    a2,a5
  64.         dbhs    d7,lmain
  65.         bra.s    lexma
  66.  
  67. lins2:        rol    #8,d6
  68.         move.b    d6,-(a2)
  69. ltest1:        cmp.l    a2,a5
  70.         dbhs    d7,lmain
  71. lexma        bhs.s    lexit
  72.  
  73. lmain1:        move    -(a1),d6
  74.         moveq    #15,d7
  75. lmain:        add    d6,d6
  76.         bcc.s    lins
  77.  
  78.         dbf    d7,llen1
  79.         move    -(a1),d6
  80.         moveq    #15,d7
  81. llen1:        add    d6,d6
  82.         bcs.s    llen6
  83.         moveq    #2,d1
  84.         moveq    #4-2,d3
  85.         dbf    d7,llen2
  86.         move    -(a1),d6
  87.         moveq    #15,d7
  88. llen2:        add    d6,d6
  89.         bcs.s    llen5
  90.         dbf    d7,llen3
  91.         move    -(a1),d6
  92.         moveq    #15,d7
  93. llen3:        add    d6,d6
  94.         bcc.s    llen4
  95.         moveq    #4,d1
  96.         moveq    #8-2,d3
  97.         lea    llen3a(pc),a6
  98.         bra.s    lbits
  99. llen3a:        add    d1,d3
  100.         cmp    #15,d1
  101.         blo.s    loff1
  102.  
  103.         moveq    #5,d1
  104.         moveq    #14-1,d3
  105.         lea    llen3b(pc),a6
  106.         bra.s    lbits
  107.  
  108. llen4:        moveq    #23-2,d3
  109. lloop:        moveq    #8,d1
  110. llen5:        move.l    a4,a6
  111.         bra.s    lbits
  112. llen5a:        add    d1,d3
  113.         not.b    d1
  114.         dbeq    d7,loff2
  115.         bne.s    loff2a
  116.         bra.s    lloop
  117.  
  118. loff6:        add    d1,a0
  119.         move.b    (a0),-(a2)
  120. lcopy:        move.b    -(a0),-(a2)
  121.         dbf    d3,lcopy
  122. ltest:        cmp.l    a2,a5
  123.         dbhs    d7,lmain
  124.         blo.s    lmain1
  125. lexit:        rts
  126.  
  127. llen6:        dbf    d7,llen7
  128.         move    -(a1),d6
  129.         moveq    #15,d7
  130. llen7:        add    d6,d6
  131.         addx    d0,d3
  132. loff1:        dbf    d7,loff2
  133. loff2a:        move    -(a1),d6
  134.         moveq    #15,d7
  135. loff2:        add    d6,d6
  136.         bcs.s    loff3
  137.  
  138.         dbf    d7,loff4
  139.         move    -(a1),d6
  140.         moveq    #15,d7
  141. loff4:        moveq    #9,d1
  142.         lea    32(a2),a0
  143.         add    d6,d6
  144.         bcc.s    loff5
  145.         moveq    #5,d1
  146.         move.l    a2,a0
  147.         bra.s    loff5
  148. loff3:        lea    544(a2),a0
  149.         move    d2,d1
  150. loff5:        move.l    a3,a6
  151.  
  152. lbits:        and.l    d4,d6
  153.         sub    d1,d7
  154.         bpl.s    lbits2
  155.         add    d7,d1
  156.         lsl.l    d1,d6
  157.         move    d7,d1
  158.         move    -(a1),d6
  159.         neg    d1
  160.         add    d5,d7
  161. lbits2:        lsl.l    d1,d6
  162.         move.l    d6,d1
  163.         swap    d1
  164.         jmp    (a6)
  165.  
  166. ; This part is not executed very often.  Some files may decrunch much slower
  167. ; on the 68020/68030.
  168.  
  169. llen3b:        add    d1,d3
  170. l2ins:        subq    #8,d7
  171.         bmi.s    l2ins1
  172.         rol    #8,d6
  173.         move.b    d6,-(a2)
  174.         dbf    d3,l2ins
  175.         bra.s    ltest
  176.  
  177. l2ins1:        move    d7,d1
  178.         addq    #8,d7
  179.         lsl.l    d7,d6
  180.         move    -(a1),d6
  181.         neg    d1
  182.         lsl.l    d1,d6
  183.         addq    #8,d7
  184.         swap    d6
  185.         move.b    d6,-(a2)
  186.         swap    d6
  187.         dbf    d3,l2ins
  188.         bra    ltest
  189.  
  190.